package com.im.netty.handler;

import com.im.util.ConstantUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.timeout.IdleStateHandler;
import lombok.extern.slf4j.Slf4j;

/**
 * 用户自定义事件监听
 * @Author: szw
 * @Date: 2021/5/11 11:14
 */
@Slf4j
public class UserEventTriggeredHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        // http升级握手成功
        if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
            log.info("新的连接接入：{}", ctx.channel().id().asLongText());
            // 维护连接

            ConstantUtil.addGROUP(ctx.channel());
            log.info("当前客户端连接数：{}", ConstantUtil.getAllChannel().size());

            // 校验成功之后的逻辑
            handshakeSuccess(ctx);
        }
        super.userEventTriggered(ctx, evt);
    }

    /**
     * 握手成功之后逻辑-增加心跳
     * @param ctx
     */
    private void handshakeSuccess(ChannelHandlerContext ctx) {

        // 校验完成添加空闲处理器
        ChannelPipeline pipeline = ctx.channel().pipeline();
        // 如果是读写空闲  不处理
        // 处理心跳超时,readerIdleTime读超时时间, writerIdleTime：为写超时时间, allIdleTime：所有类型的超时时间, TimeUnit.MINUTES分钟，不写则为秒
//        pipeline.addLast(new IdleStateHandler(2,2,5, TimeUnit.MINUTES));
        pipeline.addLast(new IdleStateHandler(5,5,10));
        pipeline.addLast(new HeartBeatHandler());
    }

}
